/**
 * Конструктор класс графического объекта диаграммы.
 * @param name Имя объекта.
 * @param x Координата x объекта.
 * @param y Координата y объекта.
 * @constructor
 */
function DiagramObject (name, x, y) {
    this.name = name;
    this.weight = 80;
    this.height = 40;
    this.x = x;
    this.y = y;
    this.isSelected = false;
}

/**
 * Метод класса графического объекта рисования объекта.
 * @param canvas Контекст рисования.
 */
DiagramObject.prototype.draw = function(canvas) {

    // Получение сцены
    var scene = canvas.getContext('2d');

    // Рисование объекта
    if (this.isSelected) {
        scene.strokeStyle = 'red';
    } else {
        scene.strokeStyle = 'black';
    }
    scene.strokeRect(this.x, this.y, this.weight, this.height);

    // Рисование текста.
    scene.font = '12pt Calibri';
    scene.fillStyle = 'black';
    scene.fillText(this.name, this.x + 20, this.y + 20);

};

/**
 * Метод получения x координаты объекта.
 * @returns {number} Значение координаты x.
 */
DiagramObject.prototype.getX = function() {
    return this.x;
};

/**
 * Метод получения y координаты объекта.
 * @returns {number} Значение координаты.
 */
DiagramObject.prototype.getY = function() {
    return this.y;
};

/**
 * Метод получения значения длины объекта.
 * @returns {number} Значение длины объекта.
 */
DiagramObject.prototype.getWeight = function() {
    return this.weight;
};

/**
 * Метод получения значения ширины объекта.
 * @returns {number} Значение ширины объекта.
 */
DiagramObject.prototype.getHeight = function() {
    return this.height;
};

/**
 * Метод проверки, принадлежат ли введенные координаты объекту.
 * @param x Проверяемая координата x.
 * @param y Проверяемая координата y.
 * @returns {boolean} true, если принадлежит, иначе, false.
 */
DiagramObject.prototype.isOwned = function(x, y) {
    if (x >= this.x && x <= this.x + this.weight + 7) {
        if (y >= this.y && y <= this.y + this.height + 7) {
            return true;
        }
    }

    return false;
};

/**
 * Метод выделения объекта.
 */
DiagramObject.prototype.select = function() {
    this.isSelected = true;
};

/**
 * Метод снятия выделения объекта.
 */
DiagramObject.prototype.unselect = function() {
    this.isSelected = false;
};

/**
 * Метод обработки клика.
 * @param x Координата x где кликнул пользователь.
 * @param y Координата y где кликнул пользователь.
 * @returns {boolean} false, если объект выделяется, иначе, true.
 */
DiagramObject.prototype.click = function(x, y) {
    if (this.isOwned(x, y)) {
        this.select();
        return false;
    } else {
        this.unselect();
        return true;
    }
};